3-5 JSAPI接口解析&内网穿透解决方案
JSAPI 下单接口解析
接口信息
| 项目 | 值 |
|---|---|
| URL | https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi |
| 方法 | POST |
| 版本 | APIv3 |
核心参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
appid | string | 是 | 小程序 APPID |
mchid | string | 是 | 商户号 |
description | string | 是 | 商品描述 |
out_trade_no | string | 是 | 商户订单号(数字、字母、下划线、*) |
time_expire | string | 否 | 交易结束时间(如 30 分钟后) |
attach | string | 否 | 附加数据(原样返回) |
notify_url | string | 是 | 支付结果通知地址(HTTPS) |
amount.total | int | 是 | 订单总金额(单位:分) |
amount.currency | string | 否 | 货币类型(CNY) |
payer.openid | string | 是 | 支付者 OpenID |
支付通知回调
微信服务器会向 notify_url 发送 POST 请求:
{
"id": "通知ID",
"create_time": "通知创建时间",
"event_type": "TRANSACTION.SUCCESS",
"resource_type": "encrypt-resource",
"resource": {
"algorithm": "AEAD_AES_256_GCM",
"ciphertext": "加密密文",
"nonce": "随机串",
"associated_data": "附加数据"
}
}
json
解密需要:APIv3 密钥 + nonce + associated_data + ciphertext,使用 AES-256-GCM 算法。
两个关键问题
问题一:notify_url 如何调试
notify_url 要求 HTTPS 且外网可访问,本地开发环境无法直接满足。
问题二:加密数据如何解密
Node.js 内置的 crypto 模块即可完成 AES-256-GCM 解密,也可使用 NPM 第三方包。
内网穿透方案
方案一:公网服务器直接部署
微信服务器 → 域名(HTTPS) → 公网服务器(Nginx反向代理) → API服务
text
在公网服务器上:
- 使用 Let's Encrypt 申请 SSL 证书
- 配置 Nginx 反向代理
- 部署 NestJS API 服务
方案二:FRP 内网穿透(推荐调试用)
微信服务器 → 域名(HTTPS) → 公网服务器(FRP Server) → FRP Client(本地) → API服务
text
FRP(Fast Reverse Proxy)将内网服务映射到公网服务器,支持 TCP/UDP/HTTP/HTTPS 协议。
参考资源
- 微信支付 JSAPI 下单 - 接口文档
- FRP 官方文档 - 内网穿透工具
- RFC 5116 - AES-256-GCM 算法规范
↑